package com.carl.mall.search.thread;

import java.util.concurrent.*;

/**
 * CompletableFuture的介绍
 * 3.whenXXX和handle方法
 */
public class CompletableFutureDemo2 {

    private static ThreadPoolExecutor executor = new ThreadPoolExecutor(5
            ,50
            ,10
            , TimeUnit.SECONDS
            ,new LinkedBlockingQueue<>(100)
            , Executors.defaultThreadFactory()
            ,new ThreadPoolExecutor.AbortPolicy()
    );
//    相关方法的说明:
//            ● whenComplete 可以获取异步任务的返回值和抛出的异常信息，但是不能修改返回结果
//            ● execptionlly 当异步任务跑出了异常后会触发的方法，如果没有抛出异常该方法不会执行
//            ● handle 可以获取异步任务的返回值和抛出的异常信息，而且可以显示的修改返回的结果
//    public static void main(String[] args) throws ExecutionException, InterruptedException {
//
//        CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
//            System.out.println("线程开始了...");
//            int i = 100 / 0;
//            System.out.println("线程结束了...");
//            return i;
//        }, executor).handle((res,exec)->{
//            System.out.println("res = " + res + ":exec="+exec);
//            return res * 10;  //显示的修改返回的结果
//        });
//        // 可以处理异步任务之后的操作
//        System.out.println("获取的线程的返回结果是：" + future.get() );
//    }
//    输出： 没有异常
//    线程开始了...
//    线程结束了...
//    res = 20:exec=null
//    获取的线程的返回结果是：200
//    输出：有异常
//    线程开始了...
//    res = null:exec=java.util.concurrent.CompletionException: java.lang.ArithmeticException: / by zero


//   public static void main(String[] args) throws ExecutionException, InterruptedException {
//
//        CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
//            System.out.println("线程开始了...");
//            int i = 100 / 10;
//            System.out.println("线程结束了...");
//            return i;
//        }, executor).whenCompleteAsync((res,exec)->{
//            System.out.println("res = " + res);
//            System.out.println("exec = " + exec);
//        }).exceptionally((res)->{ // 在异步任务显示的抛出了异常后才会触发的方法
//            System.out.println("res 2= " + res);
//            return 10;
//        });
//        // 可以处理异步任务之后的操作
//        System.out.println("获取的线程的返回结果是：" + future.get() );
//    }

    //输出：有异常
//    线程开始了...
//    res = null
//    exec = java.util.concurrent.CompletionException: java.lang.ArithmeticException: / by zero
//    res 2= java.util.concurrent.CompletionException: java.lang.ArithmeticException: / by zero
//    获取的线程的返回结果是：10
    //输出：没有异常 不走res2
//    线程开始了...
//    线程结束了...
//    res = 10
//    exec = null
//    获取的线程的返回结果是：10



//    public static void main(String[] args) throws ExecutionException, InterruptedException {
//
//        CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
//            System.out.println("线程开始了...");
//            int i = 100 / 0;
//            System.out.println("线程结束了...");
//            return i;
//        }, executor).whenCompleteAsync((res,exec)->{
//            System.out.println("res = " + res);
//            System.out.println("exec = " + exec);
//        });
//        // 可以处理异步任务之后的操作
//        System.out.println("获取的线程的返回结果是：" + future.get() );
//
//        //输出： 可以获取结果和异常信息
////        线程开始了...
////        res = null
////        exec = java.util.concurrent.CompletionException: java.lang.ArithmeticException: / by zero
//    }
}
